package data;


import java.sql.Connection;


import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dataTransferObject.Usuario;


public class JDBCUsuarioDAO implements IUsuarioDAO {
 
	private IUbicacionDAO ubicacionDAO;
	private IAficionDAO aficionDAO;
	private ILugarDAO lugarDAO;
	private IMascotaDAO mascotaDAO;
	private IRolDAO rolDAO;
	private IEstadoDAO estadoDAO;
	private IDestinoDAO destinoDAO;
	private IOrigenDAO origenDAO;
	
	public JDBCUsuarioDAO(){

		 ubicacionDAO = new JDBCUbicacionDAO();
		 aficionDAO = new JDBCAficionDAO();
		 lugarDAO = new JDBCLugarDAO();
		 mascotaDAO = new JDBCMascotaDAO();
		 rolDAO = new JDBCRolDAO();
		 estadoDAO= new JDBCEstadoDAO();
		 destinoDAO= new JDBCDestinoDAO();
		 origenDAO= new JDBCOrigenDAO();
	}

	public int selectUsuario(String email, String password, int idRol) {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		PreparedStatement stmt = null;
		ResultSet resultSet = null;
		int idUsuario = -1;
		String sql = "SELECT * FROM usuario JOIN perfil USING (ID_USUARIO)" +
					 " WHERE EMAIL = ? AND PASSWORD = ? AND ID_ROL = ?";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, email);
			stmt.setString(2, password);
			stmt.setInt(3, idRol);
			resultSet = stmt.executeQuery();
			
			if (resultSet.next()) {
				idUsuario = resultSet.getInt("ID_USUARIO");
			}
		} catch (SQLException e) { 
			System.out.println("selectUsuario Message: " + e.getMessage());
		    System.out.println("selectUsuario SQLState: " + e.getSQLState());
		    System.out.println("selectUsuario ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().CheckIn(conn);
		    try {
		        if (resultSet != null) {
		            resultSet.close();
		        }
		        if (stmt != null) {
		        	stmt.close();
		        }
		    } catch (Exception e) {
		    } 
		}
		return idUsuario;
	}

public boolean insertNuevoAmigo(Usuario amigo,Usuario usuario){
	Connection conn = ConnectionManager.getInstance().CheckOut();
    PreparedStatement stmt = null;
    int registros = 0;
	boolean resultado = false;

    String sql = "INSERT INTO amigo(ID_USUARIO,ID_AMIGO)VALUES(?,?)";

    try {
        stmt = conn.prepareStatement(sql);
        stmt.setInt(1, usuario.getIdUsuario());
        stmt.setInt(2, amigo.getIdUsuario());

       registros = stmt.executeUpdate();
        
        stmt = conn.prepareStatement(sql);
        stmt.setInt(2, usuario.getIdUsuario());
        stmt.setInt(1, amigo.getIdUsuario());

        registros += stmt.executeUpdate();
        
        if(registros > 0)
        	resultado = true;
     
    } catch (SQLException e) {
        System.out.println("selectUsuario Message: " + e.getMessage());
        System.out.println("selectUsuario SQLState: " + e.getSQLState());
        System.out.println("selectUsuario ErrorCode: " + e.getErrorCode());
    } finally {
    	ConnectionManager.getInstance().CheckIn(conn);
        try {
            
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
        }
    }
    return resultado;
	}

public boolean deleteAmigo(Usuario amigo,Usuario usuario){
	Connection conn = ConnectionManager.getInstance().CheckOut();
    PreparedStatement stmt = null;
    int registros = 0;
	boolean resultado = false;

    String sql = "DELETE FROM amigo WHERE (ID_USUARIO=?) AND (ID_AMIGO=?)";

    try {
        stmt = conn.prepareStatement(sql);
        stmt.setInt(1, usuario.getIdUsuario());
        stmt.setInt(2, amigo.getIdUsuario());

       registros = stmt.executeUpdate();
        
        stmt = conn.prepareStatement(sql);
        stmt.setInt(2, usuario.getIdUsuario());
        stmt.setInt(1, amigo.getIdUsuario());

        registros += stmt.executeUpdate();
        
        if(registros > 0)
        	resultado = true;
     
    } catch (SQLException e) {
        System.out.println("selectUsuario Message: " + e.getMessage());
        System.out.println("selectUsuario SQLState: " + e.getSQLState());
        System.out.println("selectUsuario ErrorCode: " + e.getErrorCode());
    } finally {
    	ConnectionManager.getInstance().CheckIn(conn);
        try {
            
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
        }
    }
    return resultado;
	}




	public void actualizaAmigos(Usuario usuario) {

		Connection conn = ConnectionManager.getInstance().CheckOut();
			List<Usuario> listaAmigos = new ArrayList<Usuario>();
		 	PreparedStatement stmt = null;
	        ResultSet resultSet = null;
	        Usuario amigo = null;
	        
	        String sql = "SELECT ID_AMIGO FROM amigo WHERE (ID_USUARIO=?)";

	        try {
	            stmt = conn.prepareStatement(sql);
	            stmt.setInt(1, usuario.getIdUsuario());
	            resultSet = stmt.executeQuery();

	            while(resultSet.next()){
	    			amigo=selectUsuario(conn,resultSet.getInt("ID_AMIGO"));	    			
	            	listaAmigos.add(amigo);
	    		}
	            
	           
	        } catch (SQLException e) {
	            System.out.println("actualizaAmigos Message: " + e.getMessage());
	            System.out.println("actualizaAmigos SQLState: " + e.getSQLState());
	            System.out.println("actualizaAmigos ErrorCode: " + e.getErrorCode());
	        } finally {
	        	ConnectionManager.getInstance().CheckIn(conn);
	            try {
	                if (resultSet != null) {
	                    resultSet.close();
	                }
	                if (stmt != null) {
	                    stmt.close();
	                }
	            } catch (SQLException e) {
	            }
	        }
	        usuario.setAmigos(listaAmigos);
	}
	
	
	public Usuario selectDuenyo(int idMascota) {
		
		Connection conn = ConnectionManager.getInstance().CheckOut();
		Usuario duenyo = null;
        PreparedStatement stmt = null;
        ResultSet resultSet = null;
        
        String sql = "SELECT * FROM usuario, mascotas_us WHERE mascotas_us.ID_MASCOTA=? AND mascotas_us.ID_USUARIO=usuario.ID_USUARIO;";

        try {
           
        	stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idMascota);
            resultSet = stmt.executeQuery();

            if (resultSet.next()) {
            	 	
            	duenyo=selectUsuario(resultSet.getInt("ID_USUARIO"));
            
            }
            
           
        } catch (SQLException e) {
            
        	System.out.println("selectUsuario Message: " + e.getMessage());
            System.out.println("selectUsuario SQLState: " + e.getSQLState());
            System.out.println("selectUsuario ErrorCode: " + e.getErrorCode());
        
        } finally {
        	
        	ConnectionManager.getInstance().CheckIn(conn);
            
        	try {
               
        		if (resultSet != null) {
                   
        			resultSet.close();
               
        		}
                
        		if (stmt != null) {
                    
        			stmt.close();
                
        		}
            
        	} catch (SQLException e) {

        	}
        
        }

        return duenyo;
		
	}






	
	public Usuario selectUsuario(Connection conn,int idUsuario) {

		Usuario usuario = null;
        PreparedStatement stmt = null;
        ResultSet resultSet = null;
        
        String sql = "SELECT * FROM usuario WHERE (ID_USUARIO=?)";

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idUsuario);
            resultSet = stmt.executeQuery();

            if (resultSet.next()) {
            	usuario = new Usuario();
            	usuario.setIdUsuario(resultSet.getInt("ID_USUARIO"));
            	usuario.setEmail(resultSet.getString("EMAIL"));
            	usuario.setNombre(resultSet.getString("NOMBRE"));
            	usuario.setApellidos(resultSet.getString("APELLIDOS"));
            	usuario.setSexo(resultSet.getString("SEXO"));
            	usuario.setFecha_Nacimiento(resultSet.getDate("FECHA_NACIMIENTO"));
            	usuario.setPassword(resultSet.getString("PASSWORD"));
            	usuario.setImagen_de_usuario(resultSet.getString("FOTO"));
            	//obtenemos la direccion
            	usuario.setDomicilio(ubicacionDAO.selectUbicacion(conn,resultSet.getInt("ID_DIRECCION")));
            	//Obtenemos el rol
            	usuario.setRol(rolDAO.selectRolPorUsuario(conn,idUsuario));
            	//obtenemos las aficiones
            	usuario.setAficiones(aficionDAO.selectAficiones(conn,idUsuario));
            	//obtenemos los lugares de interes
            	usuario.setLugaresDeInteres(lugarDAO.selectLugaresDeInteres(conn,idUsuario));
            	//obtenemos las mascotas
            	usuario.setMascotas(mascotaDAO.selectMascotas(conn, idUsuario));
            	//obtenemos destinos
            	usuario.setVoyA(destinoDAO.selectDestino(conn,idUsuario));
            	//obtenemos origenes
            	usuario.setEstoyEn(origenDAO.selectOrigen(conn,idUsuario));
            	//obtenemos estados
            	usuario.setEstados(estadoDAO.selectEstado(conn,idUsuario));
            	
         
            }
            
           
        } catch (SQLException e) {
            System.out.println("selectUsuario Message: " + e.getMessage());
            System.out.println("selectUsuario SQLState: " + e.getSQLState());
            System.out.println("selectUsuario ErrorCode: " + e.getErrorCode());
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }

        return usuario;
	}

	@Override
	public Usuario selectUsuario(int idUsuario) {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		Usuario usuario = selectUsuario(conn, idUsuario);
    	ConnectionManager.getInstance().CheckIn(conn);
    	return usuario;

	}
	
	
	
	

}
